package com.zxlfysj.recursion;

/**
 * 八皇后问题
 * @author yangshujing
 * @create 2020-08-17 22:18
 */
public class Queen8 {
    int max = 8; //定义共有八个皇后
    int[] array = new int[max];  //下标表示第几个皇后(0开始)，对应的值表示放在第几列
    static int count = 0;
    public static void main(String[] args) {
        //测试
        Queen8 queen8 = new Queen8();
        queen8.check(0);
        System.out.printf("一共有%d解法", count);
    }

    //放置第n个皇后
    private void check(int n) {
        if(n == max) {
            print();
            return;
        }
        //依次放入皇后，并判断是否冲突
        for(int i = 0; i < max; i++) {
            array[n] = i;
            if(judge(n)) {
                check(n + 1);
            }
        }
    }

    //查看当放置第n个皇后，检测有没有与前面的冲突
    private boolean judge(int n) {
        for(int i = 0; i < n; i++) {
            //array[i] == array[n]  判断是否在同一列
            //Math.abs(n - i) == Math.abs(array[n] - array[i]) 判断是否在同一斜线
            if(array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {
                return false;
            }
        }
        return true;
    }

    //输出摆放结果
    private void print() {
        count++;
        for(int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}
